home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 34
/
Aminet 34 (2000)(Schatztruhe)[!][Dec 1999].iso
/
Aminet
/
comm
/
misc
/
SnoopTAT.lha
/
SnoopTAT
/
rexx
/
SnoopTAT.rexx
< prev
Wrap
OS/2 REXX Batch file
|
1999-10-27
|
13KB
|
520 lines
/*
Calcola il costo mensile dei collegamenti con il proprio Provider Internet.
$VER: SnoopTAT 1.0 (19.10.1999) By 41 (Marco Casavecchia :o) Codice ispirato ed in parte prelevato da "Scatti2.5" di Giovanni Addabbo.
*/
sec = Time(s)
giorno = Date(w)
CALL SETTIMANA
ora = Time(n)
data = Date(e)
cont = Date(i)
IF ~Exists('libs:rexxsupport.library') THEN DO
SAY 'Questo script richiede la rexxsupport.library'
EXIT
END
IF ~Show('l','rexxsupport.library') THEN AddLib('rexxsupport.library',0,-30)
SIGNAL ON BREAK_C
IF Show('P','SNOOPTAT_MOSTRA') THEN DO
ADDRESS 'SNOOPTAT_MOSTRA'
'CALL BREAK_S'
END
/* Inizializza le Variabili */
/**/
esc = '1B'x;su = esc||'M';bold = esc||'[1m';plain = esc||'[0m'
italic = esc||'[3m';bianco = esc||'[32m';nocurs = esc||'[0 p';
nl = '0a'x;
mostra = 'no';interv = 0;nul = 0
par1 = '';par2 = '';par3 = '';par4 = '';config = ''
iva = 0.19
/**/
/* Ricava gli Argomenti */
/**/
ARG par
IF par = '?' THEN CALL USO
par = Translate(par,' ','=')
posB=Find(par,'BOOT'); IF posB=0 THEN posB=Find(par,'B')
posM=Find(par,'MOSTRA'); IF posM=0 THEN posM=Find(par,'M')
posC=Find(par,'CONFIG'); IF posC=0 THEN posC=Find(par,'C')
/**/
/* Valuta gli Argomenti forniti */
/**/
IF posM~=0 THEN DO
interv = SubWord(par,posm+1,1);IF Datatype(interv,'w') = 0 THEN CALL USO
mostra = 'si'
END
IF posC~=0 THEN DO
config = SubWord(par,posc+1)
IF config ='' THEN CALL USO
END
config = Strip(config,'b',' ''"')
IF config = '' THEN config = 'ENV:SNOOPTAT.CFG'
IF ~Open('cfg',config,'r') THEN CALL ERRORE1(config)
IF ReadLn('cfg') ~='CFG SNOOPTAT 1.0' THEN DO
SAY nl||bold'SnoopTAT: Errore!'plain
SAY italic'Il file 'config' non è un file di configurazione valido!!'plain
EXIT
END
/**/
/* Legge i dati dal file di configurazione */
/**/
temp = ReadLn('cfg')
log = ReadLn('cfg')
lav = ReadLn('cfg')
int1 = ReadLn('cfg')
int2 = ReadLn('cfg')
not1 = ReadLn('cfg')
not2 = ReadLn('cfg')
form = UPPER(ReadLn('cfg'))
sc = ReadLn('cfg')
unit = ReadLn('cfg')
con = ReadLn('cfg')
pb = UPPER(ReadLn('cfg'))
IF ~Close('cfg') THEN CALL ERRORE2(cfg)
IF Right(temp,1) ~= '/' & Right(temp,1) ~= ':' THEN temp = temp||'/'
IF Right(log,1) ~= '/' & Right(log,1) ~= ':' THEN log = log||'/'
IF Right(lav,1) ~= '/' & Right(lav,1) ~= ':' THEN lav = lav||'/'
temp2 = temp||'SnoopTAT_resume.tmp'
temp = temp||'SnoopTAT.tmp'
lasso = con
/* aggiunge l'IVA :( al costo dello scatto alla risposta */
unit = unit + (unit * iva)
/**/
/* Scrive il file temporaneo*/
/**/
CALL SCRIVETEMP
/**/
IF posB ~= 0 THEN EXIT
/* Legge i dati dal file temporaneo */
/**/
IF ~Open('temp',temp,'r') THEN CALL ERRORE1(temp)
cont0 = ReadLn('temp')
sec0 = ReadLn('temp') /* legge i secondi da temp */
giorno = ReadLn('temp') /* legge il giorno da temp */
ora = ReadLn('temp') /* legge l'ora da temp */
data = ReadLn('temp') /* legge la data da temp */
IF ~Close('temp') THEN CALL ERRORE2(temp)
/**/
/* Verifica se è Domenica, Sabato o Festivo */
/**/
TARIFFA:
data1 = Left(data,5)
SELECT
WHEN data1 = "13/04" THEN CALL FESTIVO() /* Pasquetta: varia negli anni --> aggiustare */
WHEN data1 = "01/01" | data1 = "06/01" | data1 = "25/04" THEN CALL FESTIVO()
WHEN data1 = "01/05" | data1 = "15/08" | data1 = "01/11" | data1 = "25/12" | data1 = "26/12" THEN CALL FESTIVO()
WHEN giorno = "Domenica" THEN CALL FESTIVO()
WHEN giorno = "Sabato" THEN CALL SABATO()
OTHERWISE CALL FERIALE()
END
IF mostra='si' THEN DO
IF ~Show('P','SNOOPTAT_MOSTRA') THEN porta = OpenPort('SNOOPTAT_MOSTRA')
IF ~Open('cons','CON:160/16/270/65/SnoopTAT 1.0 - Collegamento in Corso/INACTIVE/SMART/CLOSE/SCREENWorkbench','w') THEN DO
SAY nl||bold'SnoopTAT: Errore!!'plain
SAY italic'Non è possibile aprire la 'plain||bold'console'plain
END
CALL Writeln('cons',nocurs||nl||bianco' Durata Costo Tariffa'plain)
CALL Writeln('cons',' ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯')
END
/* Esegue i calcoli tempo, costo */
/**/
CALCOLI:
IF cont>cont0 THEN sec = sec + ((cont-cont0)*24*3600)
online = (sec - sec0) + con /* durata connessione */
IF online < 900 THEN DO
costo = TRUNC((online * tar1 / 60) + unit,1) /* Calcola il costo della chiamata */
scarto = sc % (tar1 / 60)
END
ELSE DO
costo = TRUNC((15 * tar1) + ((online-900) * tar2 / 60),1)
scarto = sc % (tar2 / 60)
END
minuti = online % 60
secondi = online // 60
ore = minuti % 60
minuti = minuti // 60
/* Formula convenienza urbana */
IF form = 'URBANA' & online > ini THEN DO
costo = TRUNC((ini * tar1 / 60) + (500 * tar1 / 60 / 2) + ((online-900) * tar2 / 60 /2) + unit,1)
scarto = scarto * 2
END
/* Formula convenienza internet */
/* NON ESISTE PIU'! */
costo = LEFT(costo,LENGTH(costo)-2) /* Tronca i decimali.. Telecom conferma :) */
/**/
/* Funzione Mostra Attiva - Visualizza Costo */
/**/
IF mostra = 'si' THEN DO
CALL Writeln('cons',' 'Right(ore,2,'0')':'Right(minuti,2,'0')':'Right(secondi,2,'0')' 'bold||Right(costo,7,' ')||plain' '||form)
DELAY(interv*50)
lasso = lasso + interv
CALL Writeln('cons',Copies(su,2))
sec = Time('s')
cont = Date(i)
IF interv = 0 THEN EXIT
pack = GetPkt('SNOOPTAT_MOSTRA')
IF pack ~= null() THEN DO
com = GetArg(pack)
CALL Reply(pack,'0')
INTERPRET com
END
IF (lasso ~< scarto) THEN DO
lasso = 0
CALL SCRIVETEMP2()
END
CALL CALCOLI
END
/**/
/* Elabora i nomi dei file */
/**/
AGGIORNA:
mese = substr(data,4)
appoggio = right(mese,2)
IF appoggio ~< 2000 THEN DO
app = left(mese,2)||'_20'||appoggio
mese = left(mese,3)||'20'||appoggio
END
ELSE DO
app = left(mese,2)||'_19'||appoggio /* stringa da appendere al nome del file */
mese = left(mese,3)||'19'||appoggio
END
log1 = log||'SnoopTAT.log' /* nome file phonebill */
log = log||'Spese_'||app||'.log' /* nome file log */
lav = lav||'SnoopTAT.lav' /* nome file lavoro */
/* Se non esiste già, crea testatina file di log */
IF ~Exists(log) THEN DO
IF ~Open('log',log,'w') THEN CALL ERRORE1(log)
CALL WriteLn('log',Center('LOGFILE GENERATO DA SnoopTAT',72))
CALL WriteLn('log',Center('Realizzazione By 41 (Marco Casavecchia ;o)',72))
CALL Writeln('log','')
CALL WriteLn('log',Center('Dati relativi al mese: '||mese,72))
CALL Writeln('log','')
CALL WriteLn('log',' +------------+-----------+------------+--------------+----------+')
CALL WriteLn('log',' | Data | Giorno | Ora inizio | Durata | Costo |')
CALL WriteLn('log',' +------------+-----------+------------+--------------+----------+')
CALL WriteLn('log','#')
CALL WriteLn('log','# TOTALE 0h 0'' 0" 0')
IF ~Close('log') THEN CALL ERRORE2(log)
END
/* Scrive il file di lavoro */
IF ~Open('log',log,'r') THEN CALL ERRORE1(log) /* Apre file log */
IF ~Open('lav',lav,'w') THEN CALL ERRORE1(lav) /* Apre file lavoro */
DO UNTIL Left(ti,6) = 'TOTALE'
ti = ReadLn('log')
IF Left(ti,1) ~= '#' THEN CALL Writeln('lav',ti) /* Copia su file lavoro */
ti = SubStr(ti,34,34)
END
IF ~Close('log') THEN CALL ERRORE2(log)
IF ~Close('lav') THEN CALL ERRORE2(lav)
appoggio = right(data0,2)
IF appoggio ~< 2000 THEN
data0 = left(data0,6)||'20'||appoggio
ELSE
data0 = left(data0,6)||'19'||appoggio
IF nul = 2 THEN DO
linea = ' | 'data0' | 'Center(giorno0,9)' | 'ora0' |Chiamata Non Conteggiata |'
linea1 = '# 'ti
CALL SCRIVE
RETURN
END
/* Ricava i totali dal file di log */
totco = Strip(Right(ti,8))
totore = Strip(SubStr(ti,12,3))
totmin = Strip(SubStr(ti,17,2))
totsec = Strip(SubStr(ti,21,2))
/* Calcola i nuovi totali */
totco = totco + costo
totsec = totsec + secondi ; addmin = totsec % 60 ; totsec = totsec // 60
totmin = addmin + minuti + totmin ; addore = totmin % 60 ; totmin = totmin //60
totore = totore + ore + addore
totco = Right(totco,8,' ')
totsec = Right(totsec,2,' ')
totmin = Right(totmin,2,' ')
totore = Right(totore,3,' ')
totdur = totore'h 'totmin''' 'totsec'"'
costo = Right(costo,8,' ')
minuti = Right(minuti,2,' ')
secondi= Right(secondi,2,' ')
ore = Right(ore,3,' ')
/* Aggiorna il file di log */
durata = ore||'h 'minuti||"' "||secondi'"'
IF nul = 1 THEN
linea = ' | 'data0' | 'Center(giorno0,9)' | 'ora0' | 'durata' | 'costo'*|'
ELSE
linea = ' | 'data0' | 'Center(giorno0,9)' | 'ora0' | 'durata' | 'costo' |'
linea1 = '# TOTALE 'totdur' 'totco
SCRIVE:
IF ~Open('lav',lav,'a') THEN CALL ERRORE1(lav)
CALL Writeln('lav',linea)
CALL WriteLn('lav',' +------------+-----------+------------+--------------+----------+')
CALL Writeln('lav','#')
CALL WriteLn('lav',linea1)
IF ~Close('lav') THEN CALL ERRORE2(lav)
/**/
/* Copia il file di log, cancella i file temp e lav */
/**/
ADDRESS command
'copy >nil:' lav log /* Copia il file lavoro su log */
'delete >nil:' lav /* Cancella file lavoro */
'delete >nil:' temp /* Cancella file temporaneo */
IF Exists(temp2) THEN DO
ADDRESS command
'delete >nil:' temp2
END
IF nul >= 1 THEN DO
nul = 0
RETURN
END
/**/
/* Scrive il file per phonebill */
/**/
IF pb = 'si' THEN DO
IF Exists(log1) THEN DO
IF ~Open('log1',log1,'a') THEN CALL ERRORE1(log1)
END
ELSE DO
IF ~Open('log1',log1,'w') THEN CALL ERRORE1(log1)
END
CALL Writeln('log1','>>> '||data||' '||ora||' Inizio Sessione Internet')
CALL Writeln('log1',' 'Date(e)' 'Time(n)' Fine Sessione')
CALL Writeln('log1','')
IF ~Close('log1') THEN CALL ERRORE2(log1)
END
/**/
EXIT
/* Dati Varie Fascie Orarie */
/**/
FESTIVO:
tar1 = not1 + (not1 * iva)
tar2 = not2 + (not2 * iva)
ini = 400
RETURN
SABATO:
IF ora >= "08:00:00" & ora < "13:00:00" THEN DO
tar1 = int1 + (int1 * iva)
tar2 = int2 + (int2 * iva)
ini = 220
END
ELSE DO
tar1 = not1 + (not1 * iva)
tar2 = not2 + (not2 * iva)
ini = 400
END
RETURN
FERIALE:
IF ora >= "08:00:00" & ora < "18:30:00" THEN DO
tar1 = int1 + (int1 * iva)
tar2 = int2 + (int2 * iva)
ini = 220
END
ELSE DO
tar1 = not1 + (not1 * iva)
tar2 = not2 + (not2 * iva)
ini = 400
END
RETURN
/**/
/* Errore in Apertura/Chiusura File */
/**/
ERRORE1: /* Non si può aprire il file */
ARG file
SAY nl||bold'SnoopTAT: Errore!!'plain
SAY italic'Non è possibile aprire il file:'plain||bold' "'file'"'plain
EXIT
ERRORE2: /* Non si può chiudere il file */
ARG file
SAY nl||bold'SnoopTAT: Errore!!'plain
SAY italic'Non è possibile chiudere il file:'plain||bold' "'file'"'plain
EXIT
/**/
BREAK_C:
CALL ClosePort(porta)
ADDRESS COMMAND 'Delete >NIL: '||temp2
EXIT
BREAK_S:
CALL ClosePort(porta)
EXIT
USO:
SAY italic||nl'Uso:'plain||bold' rx SnoopTAT.rexx B=BOOT/K M=Mostra/K/N, C=Config/K/F'plain
EXIT
/* Funzione Inizia Attiva - Scrive il file Temp */
/**/
SCRIVETEMP:
/* Scrive il file temporaneo */
IF Exists(temp) THEN DO
IF ~Open('temp',temp,'r') THEN CALL ERRORE1(temp)
cont0=ReadLn('temp')
sec0=ReadLn('temp')
giorno0=ReadLn('temp')
ora0=ReadLn('temp')
data0=ReadLn('temp')
IF ~Close('temp') THEN CALL ERRORE2(temp)
sec1 = sec
IF cont>cont0 THEN sec1 = sec + ((cont-cont0)*24*3600)
IF (sec1-sec0) < 0 THEN DO
SAY nl||bold'SnoopTAT: Errore!!'plain
SAY italic'Il tuo computer deve avere qualche problema con l''orologio!!!'plain
IF ~Close('temp') THEN CALL ERRORE2(temp)
nul = 2
CALL AGGIORNA()
EXIT
END
IF posB ~= 0 THEN DO
/* Legge i dati dal secondo file temporaneo */
/**/
IF ~Open('temp2',temp2,'r') THEN DO
nul = 2
CALL AGGIORNA
END
ELSE DO
cont = ReadLn('temp2')
sec = ReadLn('temp2') /* legge i secondi da temp */
IF ~Close('temp2') THEN CALL ERRORE2(temp)
/**/
nul = 1
mostra = 'no'
CALL TARIFFA()
EXIT
END
END
END
ELSE DO
IF posB ~= 0 THEN EXIT
IF ~Open('temp',temp,'w') THEN CALL ERRORE1(temp)
CALL WriteLn('temp',cont)
CALL WriteLn('temp',sec)
CALL WriteLn('temp',giorno)
CALL WriteLn('temp',ora)
CALL WriteLn('temp',data)
IF ~Close('temp') THEN CALL ERRORE2(temp)
CALL SCRIVETEMP2()
IF posM=0 THEN DO
ADDRESS command 'Delete >NIL: '||temp2
EXIT
END
END
RETURN
/**/
/* Funzione per la creazione del secondo file di resume */
/**/
SCRIVETEMP2:
/* Scrive il secondo file temporaneo */
IF ~Open('temp2',temp2,'w') THEN CALL ERRORE1(temp)
CALL WriteLn('temp2',cont)
CALL WriteLn('temp2',sec)
IF ~Close('temp2') THEN CALL ERRORE2(temp2)
RETURN
/**/
SETTIMANA:
SELECT
WHEN giorno = 'Monday' THEN giorno = 'Lunedì'
WHEN giorno = 'Tuesday' THEN giorno = 'Martedì'
WHEN giorno = 'Wednesday' THEN giorno = 'Mercoledì'
WHEN giorno = 'Thursday' THEN giorno = 'Giovedì'
WHEN giorno = 'Friday' THEN giorno = 'Venerdì'
WHEN giorno = 'Saturday' THEN giorno = 'Sabato'
WHEN giorno = 'Sunday' THEN giorno = 'Domenica'
END
RETURN